package cn.lycode.system.service;

import cn.lycode.common.core.domain.entity.SysUser;
import cn.lycode.common.core.domain.model.ConditionDTO;
import cn.lycode.common.core.domain.model.SelectIdsDTO;
import cn.lycode.common.core.domain.model.user.RegisterBody;
import cn.lycode.common.core.page.PageResult;
import cn.lycode.system.domain.dto.sysmenu.SysUserRoleDTO;
import cn.lycode.system.domain.dto.sysuser.*;
import cn.lycode.system.domain.vo.SysUserRoleVO;
import cn.lycode.system.domain.vo.SysUserVO;

import java.util.List;

/**
 * 用户 业务层
 *
 * @author lyCode
 */
public interface SysUserService {

    SysUser getSysUserByUsernameOrNo(String username);

    SysUser getSysUserByUserId(Long userId);

    boolean checkUsernameUnique(String username);
//    boolean checkPhoneUnique(SysUser user);
//    boolean checkEmailUnique(SysUser user);

    boolean checkUsernameUniqueExceptUserId(String username, Long userId);

    /**
     * 根据用户id，查出所有角色及用户具备的角色
     * @param userId 用户id
     * @return 所有角色和用户具备的角色id
     */
    SysUserRoleVO findSysUserRole(Long userId);


    /**
     * 用于用户角色变更
     * @param dto 传入用户id及其具备的角色ids
     */
    void changeSysUserRole(SysUserRoleDTO dto);

    /**
     * 获取用户信息
     *
     * @return {@link SysUserVO}
     */
    SysUserVO getUserInfo(Long userId);

    /**
     * 更改密码
     * @param dto dto 原密码和新密码
     */
    boolean changePassword(SysUserPasswordDTO dto);

    /**
     * 重置密码
     * @param id 根据id将用户密码重置为初始密码
     */
    boolean resetPassword(Long id);


    /**
     * 批量绑定用户的部门
     * @param dto
     */
    void bindUserDept(UserDeptDTO dto);

    void bindUserPost(UserPostDTO dto);

    boolean registerUser(RegisterBody registerBody);
    /**
     * *********************************增删改查*********************************
     */
    PageResult<SysUserVO> list(ConditionDTO dto);

    List<SysUser> allUserList();
    /**
     * 创建用户
     *
     * @param dto 用户信息
     */
    int add(SysUserAddDTO dto);

    /**
     * 详情
     *
     * @param id id
     * @return {@link SysUser}
     */
    SysUserVO detail(Long id);
    /**
     * 更新用户
     *
     * @param dto 用户信息
     */
    int update(SysUserUpDTO dto);

    /**
     * 解锁用户
     * @param ids 用户ids
     * @return 成功个数
     */
    int unlockUser(List<Long> ids);
    /**
     * 删除用户
     *
     * @param dto 用户id数组
     */
    void remove(SelectIdsDTO dto);



}
